%load_ext autoreload
%autoreload 2
The autoreload extension is already loaded. To reload it, use: %reload_ext autoreload
from navground import core, sim
from navground.sim.recorded_experiment import RecordedExperiment
import numpy as np
from matplotlib import pyplot as plt
from navground.sim.ui.video import display_video, display_video_from_run
from navground.sim.ui.web_ui import WebUI
from navground.sim.notebook import notebook_view
from navground.sim.real_time import RealTimeSimulation
from functools import partial
from sklearn.metrics import classification_report
import pandas as pd
import h5py
# function to color agents according to their collision/deadlock state
def decorate(agent):
agent.type = "wheelchair"
if agent.has_been_in_collision_since(world.time - 1):
return {'fill': 'red'}
if agent.has_been_stuck_since(world.time - 1.0):
return {'fill': 'blue'}
return {'fill': 'lightgreen'}
Experiment 1: collision avoidance on HL behavior parameters via adjustable classifiers¶
0) HL behavior with parameters $\sigma\in [0.0,0.02], \tau \in [0.8,1.0], \eta \in [0,1.0]$¶
As a preliminary evaluation, to understand the motivations and needs behind RAI methodologies, we show this example where parameters have been specially set to generate conditions with larger probability of collision occurrence.
# get simulation data
data = h5py.File("experiment_18227873886153024619_2024-12-13_17-19-07/data.h5")
# select a run
run = data["run_300"]
# get experiment configurations
recorded_yaml = data.attrs.get('experiment')
recorded_experiment = sim.load_experiment(recorded_yaml)
wold_yaml = run.attrs.get('world')
world = sim.load_world(wold_yaml)
recorded_experiment.scenario.init_world(world, seed=0)
world.update(0)
display_video(world, factor=10, time_step=0.1, fps=20, duration=150, display_width=300, decorate=decorate)
Frequent collision events in red are recorded between agents.
1) Original parameters¶
In this other evaluation, parameters are chosen together with SUPSI navground expert, so to vary in meaningful ranges according to his experience: $\sigma \in [0,0.25], \tau \in [0,1], \eta \in [0,1]$
# get simulation data
data = h5py.File("experiment_2023-10-16_15-47-59/data.h5")
# select a run
run = data['run_400']
# get experiment configurations
recorded_yaml = data.attrs.get('experiment')
recorded_experiment = sim.load_experiment(recorded_yaml)
wold_yaml = run.attrs.get('world')
world = sim.load_world(wold_yaml)
recorded_experiment.scenario.init_world(world, seed=0)
world.update(0)
Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead Property name range_of_view is deprecated for Bounded, use range instead
#world.update(0)
display_video(world, factor=10, time_step=0.1, fps=20, duration=300, display_width=300, decorate=decorate)
In these settings, some collisions (red colored agents) are registered.
2) Probabilistic Safety Region at $\varepsilon = 0.1$ + anchors¶
In this second video, we restrict the simulator parameters according to the region found via PSR + Anchor-based rule extraction
$$ \hat{\mathcal{S}}^{anchor}_{\varepsilon}: \;\; \text{\textbf{\textcolor{blue}{if }}} \sigma > 0.07 \;\; \text{\textcolor{blue}{or}} \;\;\tau \leq 0.25\; \text{\textbf{\textcolor{blue}{ then}} \textit{non collision}} $$
safe_data = h5py.File("experiment_8731303372260370518_2024-11-25_13-02-57/data.h5")
# look for a run that still has some collisions
for run_id in safe_data.keys():
run = safe_data[run_id]
if run["collisions"].shape[0] > 0:
safe_run = run
break
safe_run["collisions"].shape
(3, 3)
safe_yaml = safe_data.attrs.get('experiment')
safe_experiment = sim.load_experiment(safe_yaml)
wold_yaml = safe_run.attrs.get('world')
safe_world = sim.load_world(wold_yaml)
safe_experiment.scenario.init_world(safe_world, seed=0)
world.update(0)
display_video(safe_world, factor=10, time_step=0.1, fps = 20, duration=300, display_width=300, decorate=decorate)
It can be observed how collision events, marked in red, disappear after applying the safety region, although causing a deadlock after some time, as marked by agents colored in blue.